//
//  1_两数之和.swift
//  Swift-LeetCode
//
//  Created by 卢悦明 on 2024/3/14.
/*
 https://leetcode.cn/problems/two-sum/description/
 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。

 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。

 你可以按任意顺序返回答案。

  

 示例 1：

 输入：nums = [2,7,11,15], target = 9
 输出：[0,1]
 解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。
 示例 2：

 输入：nums = [3,2,4], target = 6
 输出：[1,2]
 示例 3：

 输入：nums = [3,3], target = 6
 输出：[0,1]
 */

import UIKit

class TwoNumSum: NSObject {
    func QA() {
        print(twoSum([2,7,11,15], 9))
        print(twoSum([3,2,4], 6))
        print(twoSum([3,3], 6))
        print("--------------")
        print(twoSum1([2,7,11,15], 9))
        print(twoSum1([3,2,4], 6))
        print(twoSum1([3,3], 6))

    }
    
    /// 利用字典记录以前扫过的内容
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var dict = [Int: Int]()
        for (i, item) in nums.enumerated() {
            let char = target - item
            if let temp = dict[char] {
                return [temp, i]
            } else {
                dict[item] = i
            }
        }
        return []
    }
    
    /// 暴力法
    func twoSum1(_ nums: [Int], _ target: Int) -> [Int] {
        var i = 0
        while i < nums.count {
            var j = i + 1
            while j < nums.count {
                if nums[i] + nums[j] == target {
                    return [i, j]
                }
                j += 1
            }
            i += 1
        }
        return []
    }
}
